package com.atguigu.boot.config;

import com.atguigu.boot.bean.Pet;
import com.atguigu.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * @author : wenchao.long
 * @date : Created in 2021/02/02 13:43 周二
 * @description :
 *         <p>
 *         {@link Configuration 告诉SpringBoot这是一个配置类 === 配置文件}
 *         1. 配置类里面使用@Bean标注在方法上给容器注册组件，默认也是单实例的
 *         2. 配置类本身也是组件
 *         3. proxyBeanMethods: 代理Bean的方法
 *         -- Full(proxyBeanMethods = true) ==> 保证每个@Bean方法被调用多少次返回的组件都是单实例的
 *         -- Lite(proxyBeanMethods = false)==> 保证每个@Bean犯法被调用多少次返回的组件都是新创建的
 *         {@link Import 给容器中自动创建出value 类型的组件、默认组件的名字就是全类名}
 *         {@link ConditionalOnMissingBean 没有 name对应的Bean 才进行组件注入}
 *         {@link ConditionalOnBean 有 name对应的Bean 才进行组件注入}
 *         {@link ConditionalOnClass 有 value对应的Class 才进行组件注入}
 *         </p>
 */
@ConditionalOnClass(value = {User.class})
@Configuration()
@Import({User.class, Pet.class})
@ImportResource(locations = "classpath:beans.xml")
public class BeanConfig {

    @Bean
    public User user01() {
        return new User("zhangSan", 18);
    }

    @Bean("tom")
    public Pet tomcatPer() {
        return new Pet("tomcat");
    }
}
